home *** CD-ROM | disk | FTP | other *** search
- /*
- * the class STAGE_PULL_CORE
- * Copyright (C) 1996, 1997 Kazutaka Hirata <khirata@jove.acs.unt.edu>
- */
-
- #include "../stdafx.h"
-
- #include "stpull.h"
-
- void STAGE_PULL_CORE::erase_selected_lines(KBAN_DRAW& draw, const LINE_P_LIST &target)
- {
- LINE_P_LIST::iterator i;
- TRAVERSE(target, i) {
- const LINE_ELEMENT& current = *(i->ptr());
- draw.erase_primitive_line(current);
- }
- }
-
- void STAGE_PULL_CORE::redraw_selected_lines(KBAN_DRAW& draw, const LINE_P_LIST &target)
- {
- LINE_P_LIST::iterator i;
- TRAVERSE(target, i) {
- const LINE_ELEMENT& current = *(i->ptr());
- draw.draw_primitive_line(current, m_old_active_layer);
- }
- }
-
- void STAGE_PULL_CORE::fix_pull_lines(KBAN_DRAW& draw, const XY &ac_dst)
- {
- LINE_P_LIST::iterator i;
- TRAVERSE(m_plist, i) {
- LINE_ELEMENT& current = *(i->ptr());
- if(current.ac_s() == m_ac_target) {
- current.set_ac_s(ac_dst);
- draw.draw_primitive_line(current, m_old_active_layer);
- } else if(current.ac_e() == m_ac_target) {
- current.set_ac_e(ac_dst);
- draw.draw_primitive_line(current, m_old_active_layer);
- }
- }
- }
-
- void STAGE_PULL_CORE::delete_no_length_lines(KBAN_INFO& info)
- {
- PRIMITIVE& primitive = info.kban_data().primitive();
- LINE_LIST& line_list = primitive.layer(info.active_layer().get()).line_list();
- LINE_LIST::iterator i;
- TRAVERSE(line_list, i) {
- LINE_ELEMENT& current = *i;
- if(current.ac_s() == current.ac_e()) {
- LINE_LIST::iterator current_i = i--;
- line_list.erase(current_i);
- }
- }
- }
-
- STAGE_PULL_CORE::STAGE_PULL_CORE(const XY &ac, uint layer, const LINE_P_LIST& list)
- : m_plist(list),
- m_ac_target(ac),
- m_old_active_layer(layer),
- m_mcur(ac, layer, m_plist)
- {
- }
-
- STAGE* STAGE_PULL_CORE::init(KBAN_INFO& info, KBAN_DRAW& draw)
- {
- info.bCaptured() = true;
- erase_selected_lines(draw, m_plist);
- m_mcur.redraw_cursor(draw);
- return this;
- }
-
- STAGE* STAGE_PULL_CORE::redraw(KBAN_INFO& info, KBAN_DRAW& draw)
- {
- erase_selected_lines(draw, m_plist);
- m_mcur.redraw_cursor(draw);
- return this;
- }
-
- STAGE* STAGE_PULL_CORE::mouse_move(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
- {
- XY ac;
- info.grid().xy_pc2ac(pc, ac);
- m_mcur.draw_cursor(draw, ac);
- return this;
- }
-
- // This function is to be overridden but still needs to be called.
-
- STAGE* STAGE_PULL_CORE::mouse_left_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
- {
- m_mcur.erase_cursor(draw);
- XY ac;
- info.grid().xy_pc2ac(pc, ac);
-
- fix_pull_lines(draw, ac);
- delete_no_length_lines(info);
- info.SetModifiedFlag();
- info.new_state().set(true);
- info.new_state_str() = "Pull";
-
- m_done.set(TRUE);
- return NULL;
- }
-
- // This function is to be overridden but still needs to be called.
-
- STAGE* STAGE_PULL_CORE::mouse_right_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
- {
- return NULL;
- }
-
- void STAGE_PULL_CORE::end(KBAN_INFO& info, KBAN_DRAW& draw)
- {
- info.bCaptured() = false;
- if(!m_done.get()) {
- m_mcur.erase_cursor(draw);
- redraw_selected_lines(draw, m_plist);
- }
- }
-